package com;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;

/**
 * 使用DOM4J解析XML文档
 *
 * DOM(Document object model)文档对象模型
 * DOM解析模式为先将xml文档按照其标签包含的结构转换为一个树状数据
 * 似的我们在获取xml文档内容改为遍历树结构完成
 */
public class ParseXmlDemo {
    public static void main(String[] args) {
        /*
        解析XML的大致步骤：
        1：创建SAXReader
        2:使用SAXReader读取xml文档并产生Document对象
        这一步的作用就是DOM解析模式中先将xml文档读取并构建整棵
        树结构而过程
        3：通过Document对象获取根元素（就是xml中的根标签内容）
        4：从根元素开始逐级获取子元素，以达到解析xml文档内容的目的
         */
        try {
            //1
            SAXReader reader = new SAXReader();
            //2
            Document doc = reader.read("./emplist.xml");
//            Document doc = reader.read(new File("./emplist.xml"));
//            Document doc = reader.read(new FileInputStream("./emplist.xml"));

            /*
            3
            Document对象提供了获取根元素的方法：
            Element getRootElement()

            Element的每一个实例用于表示XML文档上的一个元素（一对标签）
            其提供了获取xml元素信息的相关方法，常用的有：
            String getName()
            获取元素名（标签名）

            String getText()
            获取文本（开始与结束标签之间的文本信息）

            String elementText(String name)
            获取取当前元素下指定名字的子元素中间的文本
            String s = e.element("xxx").getText();
            等同于
            String s = e.elementText("xxx");

            Element element(String name)
            获取当前元素中指定名字的子元素

            List elements()
            获取当前元素下的所有子元素

            List elements(String name)
            获取当前元素中所有给定的名字的同名子元素


             */
            Element root = doc.getRootElement();//root:<list>

            String name = root.getName();
            System.out.println("跟标签："+name);
            //获取跟标签<list>下所有名为<emp>的子标签
            List<Element> list = root.elements("emp");
            System.out.println(list.size());

            //遍历每一个<emp>标签来获取员工信息
            for (Element empEle : list) {
                //获取员工姓名
                //通过<emp>获取子标签<name>
                Element nameEle = empEle.element("extension");
                //获取<name>标签中间的文本
                String ename = nameEle.getText();

                //获取年龄
                int age = Integer.parseInt(empEle.element("age").getText());

                //获取性别
                String gender = empEle.elementText("gender");

                //获取工资
                int salary = Integer.parseInt(empEle.elementText("salary"));


                //获取工号
                //通过<emp>获取属性"id"
//                Attribute attr = empEle.attribute("id");
                //获取id属性的值
//                int id = Integer.parseInt(attr.getValue());

//                int id = Integer.parseInt(empEle.attribute("id").getValue());

                int id = Integer.parseInt(empEle.attributeValue("id"));

                System.out.println(id+","+ename+","+age+","+gender+","+salary);
            }

        } catch (DocumentException e) {
            e.printStackTrace();
        }


    }
}